package com.kylin.cf;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.apache.mahout.cf.taste.impl.model.MemoryIDMigrator;

public class Base {

  /**
   * 临近值 K
   */
  protected static int NEIGHBORHOOD_NUM = 3;
  /**
   * 推荐个数
   */
  protected static int RECOMMENDER_NUM = 10;

  /**
   * 存放转换的itemId map
   */
  protected static final MemoryIDMigrator thing2long = new MemoryIDMigrator();

  /**
   * 原始csv文件
   */
  protected static final File inputFile = new File(
      "/Users/t1mon/Downloads/BX-CSV-Dump/BX-Book-Ratings-MR/output/1588502266751/part-r-00000");
  /**
   * 清洗后的临时文件，也就是程序里用来做计算的文件
   */
  protected static final File tmpFile = new File(
      "/Users/t1mon/Downloads/BX-CSV-Dump/BX-Book-Ratings-MR/output/1588502266751/part-r-00000-tmp.csv");
  /**
   * 测试文件
   */
  protected static final File testFile = new File(
      "/Users/t1mon/Downloads/BX-CSV-Dump/test.csv");

  /**
   * 初始化数据, csv文件内容清洗 1. 去除"" 2. 去除rating为0的数据， 不做计算 3. 将itemId转为Long类型
   * mahout计算需要id为Long类型，这样的好处是节省内存并大大提高效率
   */
  protected static void init() throws IOException {
    // 限制处理后的文件的大小，可以截取一部分数据进行计算， 避免出现文件过大，单机算不出结果的情况
    int limit = 50000;
    // 统计源文件数据总数
    int total = 0;
    // 统计有效数据总数
    int validCount = 0;
    try (BufferedReader br = new BufferedReader(new FileReader(inputFile));
        BufferedWriter bw = new BufferedWriter(new FileWriter(tmpFile))) {
      StringBuilder sb = new StringBuilder();
      String line;
      while (validCount < limit && (line = br.readLine()) != null) {
//        total++;
//        String[] arr = line.replaceAll("\"", "").split(";");
//        if (!"0".equals(arr[2].trim())) {
//          Long intItemId = thing2long.toLongID(arr[1]);
//          thing2long.storeMapping(intItemId, arr[1]);
//          arr[1] = intItemId.toString();
//          sb.append(String.join(";", arr)).append("\n");
//          validCount++;
//        }
        String[] arr = line.replaceAll("\"", "").split(";");
        if (!"0".equals(arr[2].trim())) {
          sb.append(String.join(";", arr)).append("\n");
          validCount++;
        }
      }
      System.out.println("total: " + total + ", valid count: " + validCount);
      bw.write(sb.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
